export function 是对象(value) {
	return typeof value === "object" && value !== null && !Array.isArray(value)
	// const arr = [1, 2, 3]
	// console.log(typeof arr) // 输出: "object"
}

export function 是空对象(obj) {
	return Object.keys(obj).length == 0
}

export function 对象重予(原对象, 新对象) {
	// 清空
	for (let key in 原对象) {
		// console.log('key: ', key);
		if (原对象.hasOwnProperty(key)) {
			delete 原对象[key];
		}
	}
	Object.assign(原对象, 新对象)
}

export function 对象重新赋值废(原对象, 新对象) {
	// 清空
	// console.log('原对象: ', 原对象);
	// Object.keys(原对象).forEach((key) => {
	// 	console.log('对象重新赋值 原对象的 key: ', key);
	// 	delete 原对象[key]
	// });
	for (let key in 原对象) {
		if (原对象.hasOwnProperty(key)) {
			// console.log('对象重新赋值 hasOwnProperty 方式 原对象的 key: ', key);
			delete 原对象[key];
		}
	}
	// 把obj2的键赋予给obj1
	Object.keys(新对象).forEach((key) => {
		// console.log('重新赋值都有的 key: ', key);
		原对象[key] = 新对象[key];
	});
}

export function 对象重新赋值一精细控制一好像没必要(原对象, 新对象) {
	for (let key in 原对象) {
		if (原对象.hasOwnProperty(key)) {
			// console.log('对象重新赋值 hasOwnProperty 方式 原对象的 key: ', key);
			if (!Object.keys(新对象).includes(key)) {
				console.log('删除新对象中没有的 key: ', key);
				delete 原对象[key];
			}
		}
	}
	// 把obj2的键赋予给obj1
	Object.keys(新对象).forEach((key) => {
		// console.log('重新赋值都有的 key: ', key);
		// console.log('重新赋值都有的 原对象[key]: ', 原对象[key]);
		// console.log('重新赋值都有的 新对象[key]: ', 新对象[key]);
		if (isArray(原对象[key])) {
			数组重新赋值(原对象[key], 新对象[key])
		} else {
			原对象[key] = 新对象[key];
		}
		// 如果是对象呢？递归调用？……碰到再说
	});
}

export function 加入属性(目标对象, 取值对象, 拟排除属性组 = ["id", "UpdatedAt", "DeletedAt", "CreatedAt"]) {
	取值对象 = 成对象_排除属性(取值对象, 拟排除属性组)
	for (const key in 取值对象) {
		目标对象[key] = 取值对象[key]
	}
}

export function 成对象_排除属性(obj, 拟排除属性组 = ["id", "UpdatedAt", "DeletedAt", "CreatedAt"]) {
	const newObj = {};
	for (let key in obj) {
		// 检查key是否不在排除的键数组中
		if (!拟排除属性组.includes(key)) {
			newObj[key] = obj[key];
		}
	}
	return newObj;
}

export function 排除部分对象属性(obj, 拟删除属性组 = ["id", "UpdatedAt", "DeletedAt", "CreatedAt"]) {
	const newObj = {};
	for (let key in obj) {
		// 检查key是否不在排除的键数组中
		if (!拟删除属性组.includes(key)) {
			newObj[key] = obj[key];
		}
	}
	return newObj;
}

export function 删除部分对象属性(原对象, 拟删除属性组) {
	拟删除属性组.forEach(拟删除属性 => {
		delete 原对象[拟删除属性];
	});
}